package controller

import (
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"struggle/logic"
)

type ZanController struct{}

var DefaultZanController = &ZanController{}

// RegisterRoute 管理 ImageController 路由
func (z ZanController) RegisterRoute(r *gin.Engine) {
	// 文章 路由组
	zan := r.Group("/api")
	{

		// 需要登录后才能访问的放在下面
		zan.Use(JWTAuthMiddleware())
		// 鼓掌或取消鼓掌
		zan.POST("/zan", z.zan)
		// 查询当前登录用户是否已经鼓过掌
		zan.POST("/z", z.query)
	}
}

type ZanReq struct {
	Undo       bool   `json:"undo"` // false 是称赞、true 是取消称赞
	ObjectType int    `json:"obj_type"`
	ObjectId   uint64 `json:"obj_id"`
}

// 鼓掌或取消称赞文章、提问、评论、回答
func (z ZanController) zan(c *gin.Context) {
	// 1.通过 Bind 和 Validate 进行参数绑定和校验
	zan := &ZanReq{}
	if err := c.ShouldBindJSON(&zan); err != nil {
		// 返回参数错误的响应
		ResponseError(c, CodeInvalidParams)
		return
	}
	if zan.ObjectId == 0 {
		// 返回参数错误的响应
		ResponseError(c, CodeInvalidParams)
		return
	}
	// 2. 获取当前登录用户 sn
	userSn, err := getCurrentUserSn(c)
	if err != nil {
		zap.L().Error("用户称赞或取消称赞时未登录")
		ResponseError(c, CodeNotLogin)
		return
	}
	if !zan.Undo {
		// 3. 称赞
		err = logic.DefaultZan.Zan(zan.ObjectId, userSn, zan.ObjectType)
		if err != nil {
			ResponseError(c, CodeServerBusy)
			return
		}
	} else {
		// 取消称赞
		err = logic.DefaultZan.UnZan(zan.ObjectId, userSn, zan.ObjectType)
		if err != nil {
			ResponseError(c, CodeServerBusy)
			return
		}
	}
	// 操作成功后返回
	ResponseSuccess(c, zan.ObjectId)
	return
}

func (z ZanController) query(c *gin.Context) {
	// 1.通过 Bind 和 Validate 进行参数绑定和校验
	zan := &ZanReq{}
	if err := c.ShouldBindJSON(&zan); err != nil {
		// 返回参数错误的响应
		ResponseError(c, CodeInvalidParams)
		return
	}
	if zan.ObjectId == 0 {
		// 返回参数错误的响应
		ResponseError(c, CodeInvalidParams)
		return
	}
	// 2. 获取当前登录用户 sn
	userSn, err := getCurrentUserSn(c)
	if err != nil {
		zap.L().Error("用户查询是否称赞时未登录")
		ResponseError(c, CodeNotLogin)
		return
	}
	// 3. 查询是以及鼓过掌
	res, err := logic.DefaultZan.QueryOne(zan.ObjectId, userSn, zan.ObjectType)
	// 4. 返回
	ResponseSuccess(c, res)
}
